//基本方法，功能函数

/**
 *  生成uid
 * @return {String} 生成的id
 */
export function createUnitId(){
    let uId = '', len = 10;
    for (; uId.length < len; uId += Math.random().toString(36).substr(2));
    return uId.substr(0, len) + Date.now().toString();
}
/**
 * 获取对象长度
 * @param {Object} obj 要检查的对象
 * @return {Number} 对象长度
 */
export function getObjLength(obj){
    if(Object.prototype.toString.call(obj).toLowerCase() != '[object object]') return 0;
    let i, len=0;
    for(i in obj){
        len++;
    }
    return len;
}
/**
 * 删除对象中指定值
 * @param {Object} obj 对象
 * @param {Array} keys 要删除的id数组
 * @return {Object} 删除后的对象
 */
export function deleteObjectValue(obj, keys){
    if(Object.prototype.toString.call(obj).toLowerCase() != '[object object]') return;
    let newObj = {};
    for(let i in obj){
        if(keys.indexOf(i) < 0){
            newObj[i] = obj[i];
        }
    }
    return newObj;
}
/**
 * 判断参数是否为某类型
 * @param {Any} data 数据
 * @param {String} type 类型
 * @return {Boolean} 是否为此类型
 */
export function isType(data, type){
    const typeMap = {
        'object': '[object object]',
        'string': '[object string]',
        'array': '[object array]',
        'undefined': '[object undefined]',
        'number': '[object number]'
    }
    let judge = Object.prototype.toString.call(data).toLowerCase();
    return typeMap[type] == judge;
}
/**
 * 查找数组中符合断言条件的项
 * @param {Array} arr 需要筛选的数组
 * @param {Function} predicate 断言方法
 * @return {Number} 符合条件项的索引
 */
export function findWhere(arr, predicate){
    if(arr == null){
        throw new TypeError('"this" is null or not defined');
    }
    let o = Object(arr);
    let len = o.length >>> 0;
    if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
    }
    let thisArg = arguments[1];
    let k = 0;
    while (k < len) {
        let kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
            return k;
        }
        k++;
    }
    return -1;
}
/**
 * 判断对象数组中有没有该元素
 * @param {Array} arr 需要筛选的数组
 * @param {Object} item 需要判断的对象
 * @return {Number} 第一个符合条件的项索引
 */
export function objectArrIndexOf(arr, item){
    if(arr == null){
        throw new TypeError('"this" is null or not defined');
    }
    let len = arr.length >>> 0,
        index = 0;
    for(; index<len; index++){
        //对比对象
        if(Object.keys(arr[index]).length == Object.keys(item).length){
            let diff = 0;
            for(let i in arr[index]){
                if(item[i] !== arr[index][i]){
                    diff++;
                }
            }
            if(diff==0) return index;
        }
    }
    return -1;
}
